package com.zhouxin.customview.view

import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.view.View
import com.zhouxin.customview.extensions.dp2px

/**
 * Copyright©
 * FileName: XfermodeView
 * Author: ZhouXin
 * Date: 2022/6/7
 * Description: 关于官网展示图，Xfermode的学习
 * Tips:
 * 设置paint.xfermode时，应该考虑到图像整体的内容（包含图像本身和它外部的透明区域）
 * 所以下面注释的部分画出的图像，设置了xfermode后的效果并不是正确的效果
 * 应该画出图像和它的外部透明区域，所以这里使用bitmap来画
 * 这个bitmap包含了透明区域和图像本身（透明区域大小最小必须同时包含2个图像）
 * Summary:
 * 2个图像，不管图像本身是否透明，只有叠加部分才会有效果
 */
private val XFERMODE = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)

class XfermodeView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {
    private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
    private val bounds = RectF(150f.dp2px, 50f.dp2px, 300f.dp2px, 200f.dp2px)
    //创建一个bitmap,这个bitmap可同时包含2个图像
    private val circleBitmap =
        Bitmap.createBitmap(150f.dp2px.toInt(), 150f.dp2px.toInt(), Bitmap.Config.ARGB_8888)
    private val squareBitmap =
        Bitmap.createBitmap(150f.dp2px.toInt(), 150f.dp2px.toInt(), Bitmap.Config.ARGB_8888)

    init {
        //1.先在创建的bitmap上面绘制需要的图像
        val canvas = Canvas(circleBitmap)
        paint.color = Color.parseColor("#D81B60")
        canvas.drawOval(50f.dp2px, 0f.dp2px, 150f.dp2px, 100f.dp2px, paint)
        //切换bitmap作画
        canvas.setBitmap(squareBitmap)
        paint.color = Color.parseColor("#2196F3")
        canvas.drawRect(0f.dp2px, 50f.dp2px, 100f.dp2px, 150f.dp2px, paint)
    }

    override fun onDraw(canvas: Canvas) {
        //2.拉出离屏缓冲区
        val count = canvas.saveLayer(bounds, null)
//        paint.color = Color.parseColor("#D81B60")
//        canvas.drawOval(200f.dp2px, 50f.dp2px, 300f.dp2px, 150f.dp2px, paint)
        //3.再在canvas上画bitmap
        canvas.drawBitmap(circleBitmap, 150f.dp2px, 50f.dp2px, paint)
        //4。设置xfermode
        paint.xfermode = XFERMODE
//        paint.color = Color.parseColor("#2196F3")
//        canvas.drawRect(150f.dp2px, 100f.dp2px, 250f.dp2px, 200f.dp2px, paint)
        canvas.drawBitmap(squareBitmap, 150f.dp2px, 50f.dp2px, paint)
        //习惯性的置空，这里不设置也可以正常画出
        paint.xfermode = null
        //5.释放离屏缓冲区
        canvas.restoreToCount(count)
    }
}